#include"Function.h"

//Wstring转string函数
std::string WStringToString(const std::wstring& s) {
    std::string szStr;
    int nLen = WideCharToMultiByte(CP_OEMCP, NULL, s.c_str(), -1, NULL, 0, NULL, FALSE);
    szStr.resize(nLen);
    LPSTR lpszStr = new char[nLen];
    WideCharToMultiByte(CP_OEMCP, 0, s.c_str(), -1, lpszStr, nLen, NULL, FALSE);
    szStr = lpszStr;
    delete[] lpszStr;
    return szStr;
}
//string转wchar_t*函数
wchar_t* StringTowchar_t(std::string s) {
    /*转变过程*/
    char s1[100] = "";
    int i;
    for (i = 0; i < s.size(); i++)
        s1[i] = s[i];
    s1[i] = '\0';
    int n = MultiByteToWideChar(0, 0, s1, -1, NULL, 0);
    wchar_t* wide1 = new wchar_t[n];
    MultiByteToWideChar(0, 0, s1, -1, wide1, n);
    return wide1;
}

std::string string_GetClipboardText() {
    std::string clipboardText;
    // 打开剪贴板
    if (OpenClipboard(nullptr)) {
        // 获取剪贴板中的文本数据
        HANDLE hData = GetClipboardData(CF_TEXT);
        if (hData != nullptr) {
            // 锁定数据
            char* pszText = static_cast<char*>(GlobalLock(hData));
            if (pszText != nullptr) {
                // 获取文本长度
                size_t textLength = strlen(pszText);
                // 复制文本到字符串
                clipboardText.assign(pszText, textLength);
                // 解锁数据
                GlobalUnlock(hData);
            }
        }
        // 关闭剪贴板
        CloseClipboard();
    }
    return clipboardText;
}

std::wstring wstring_GetClipboardText() {
    std::wstring clipboardText;
    if (OpenClipboard(nullptr)) {
        HANDLE hData = GetClipboardData(CF_UNICODETEXT);
        if (hData != nullptr) {
            wchar_t* pszText = static_cast<wchar_t*>(GlobalLock(hData));
            if (pszText != nullptr) {
                clipboardText = pszText;
                GlobalUnlock(hData);
            }
        }
        CloseClipboard();
    }
    return clipboardText;
}

std::wstring GetFilePathsFromClipboard() {
    // 尝试打开剪贴板
    if (!OpenClipboard(nullptr)) {
        std::wcout << L"无法打开剪贴板" << std::endl;
        return L"";
    }

    // 获取剪贴板中CF_HDROP格式的数据（表示文件拖放数据，包含文件路径）
    HGLOBAL hData = GetClipboardData(CF_HDROP);
    if (hData == nullptr) {
        std::wcout << L"剪贴板中没有CF_HDROP格式的数据" << std::endl;
        CloseClipboard();
        return L"";
    }

    // 锁定全局内存块
    HDROP hDrop = static_cast<HDROP>(GlobalLock(hData));
    if (hDrop == nullptr) {
        std::wcout << L"无法锁定内存块" << std::endl;
        CloseClipboard();
        return L"";
    }

    // 获取剪贴板中文件的数量
    UINT fileCount = DragQueryFile(hDrop, 0xFFFFFFFF, nullptr, 0);
    if (fileCount == 0) {
        std::wcout << L"剪贴板中没有文件" << std::endl;
        GlobalUnlock(hData);
        CloseClipboard();
        return L"";
    }

    wchar_t filePath[MAX_PATH];
    // 获取第一个文件的路径
    if (DragQueryFile(hDrop, 0, filePath, MAX_PATH) == 0) {
        std::wcout << L"获取文件路径失败" << std::endl;
        GlobalUnlock(hData);
        CloseClipboard();
        return L"";
    }

    // 简单校验路径，检查是否包含路径分隔符
    bool hasSeparator = false;
    for (size_t i = 0; i < wcslen(filePath); ++i) {
        if (filePath[i] == L'\\' || filePath[i] == L'/') {
            hasSeparator = true;
            break;
        }
    }
    if (!hasSeparator) {
        std::wcout << L"获取的路径格式可能有误" << std::endl;
        GlobalUnlock(hData);
        CloseClipboard();
        return L"";
    }

    GlobalUnlock(hData);
    CloseClipboard();
    return filePath;
}
